'''
此模块用于处理Excel数据表读取相关的问题。

1.格式化读取的Excel数据表中的columns。
2.删除数据表中的指定列中数据为空的列。
3.列出所有无效的身份证号所在行。
4.自动在data_df数据表的最前面加上自增的索引列。
'''

import pandas as pd
from datatools.idcard.idcard import id_verify,id_verify_full

def format_columns(data_df):
    '''读取Excel数据表中的columns，并进行简单的处理。
    1.去掉列表列项标题中的无用空白列。
    2.去掉列表列项标题中的回车。
    data_df:为打开的Excel数据表的DataFrame
    返回：不含空列标题的列表及去掉了回车符号的列标题列表。
    '''
    columns = data_df.columns.tolist()
    columns = [item for item in columns if item.find('Unnamed')]
    new_columns = [item.replace('\n','') for item in columns]
    return columns,new_columns

def drop_na_line(data_df,col_label):
    '''删除给定数据表data_df中的col_label表示的列中数据为空的列。会对原表进行删除操作。
    data_df:要操作的数据表。
    col_label:要操作的数据列标签。
    '''
    na_data = data_df[data_df[col_label].isna()]
    data_df.drop(na_data.index,inplace=True)
    
def find_not_verify_id(data_df,id_label):
    '''获取给定数据表data_df中的id_label表示的身份证号码列中身份证号码无效的数据。
    data_df:要操作的数据表。
    id_label:要操作的身份证号码数据列标签。
    '''
    verify_id_df = data_df[id_label].apply(id_verify)
    return data_df[~verify_id_df]

def get_not_verify_id(data_df,id_label):
    '''获取给定数据表data_df中的id_label表示的身份证号码列中身份证号码无效的数据,并指明错误原因。
    data_df:要操作的数据表。
    id_label:要操作的身份证号码数据列标签。
    '''
    not_verify_df = find_not_verify_id(data_df,id_label).copy()
    not_verify_df.insert(len(not_verify_df.columns),'错误原因','')
    for index,line in not_verify_df.iterrows():
        try:
            idcard = line[id_label]
            id_verify_full(idcard)
        except ValueError as e:
            #print(e)
            not_verify_df.loc[index,['错误原因']] = str(e)
    return not_verify_df

def auto_index(data_df):
    '''自动在data_df数据表的最前面加上index列，从1开始计数。
    data_df:要操作的数据表。
    '''
    data_df.insert(0,"序号","")
    for i in range(1,data_df.shape[0]+1):
        data_df.loc[i-1,'序号'] = i
    return data_df